package com.atguigu.lease.web.app.custom.interceptor;

import com.atguigu.lease.common.login.LoginUser;
import com.atguigu.lease.common.login.LoginUserHolder;
import com.atguigu.lease.common.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 认证拦截器
 * 用于处理用户认证相关的逻辑，包括JWT令牌的验证和用户信息的存储
 */
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
    /**
     * 前置拦截方法
     * 在请求处理之前进行调用，用于验证用户身份
     *
     * @param request 当前HTTP请求对象
     * @param response 当前HTTP响应对象
     * @param handler 请求处理方法
     * @return true表示继续流程，false表示终端流程
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 从请求头中获取access-token
        String token = request.getHeader("access-token");
        // 解析JWT令牌获取声明信息
        Claims claims = JwtUtil.parseToken(token);
        // 从声明中提取用户ID和用户名
        Long userId = claims.get("userId", Long.class);
        String username = claims.get("username", String.class);
        // 将用户信息存入LoginUserHolder中，供后续业务使用
        LoginUserHolder.setLoginUser(new LoginUser(userId, username));

        return true;
    }

    /**
     * 完成后处理方法
     * 在请求完全处理后进行调用，用于清理用户信息
     *
     * @param request 当前HTTP请求对象
     * @param response 当前HTTP响应对象
     * @param handler 请求处理方法
     * @param ex 处理过程中发生的异常
     * @throws Exception 可能抛出的异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清理LoginUserHolder中的用户信息，防止内存泄漏
        LoginUserHolder.clear();
    }
}
